package com.oop.neibulei;

//成员内部类：就是位于外部类成员位置的类

public class Tes_neibulei_3 {
    public static void main(String[] args) {
        //创建对象
        //成员内部类不是静态的：外部类名.内部类名 对象名 = new 外部类名.new 内部类名()
        //成员内部类是静态的：外部类名.内部类名 对象名 = new 外部类名.内部类名()

        //外部其他类，使用公共成员内部类的方式：
        Outer08.Inner08 inner08 = new Outer08().new Inner08();
        inner08.say();
        //外部其他类，使用私有成员内部类的方式：
        //    私有的成员内部类，外部其他类无法直接创建其对象，但是可以通过外部类的方法访问
        Outer08 outer08 = new Outer08();
        outer08.waishow();
    }
}

class Outer08{  //外部类
    private int n1 = 10;
    public String name = "张三";
    private void hi(){}

    public class Inner08{
        private int n1 = 60;
        //成员内部类
        public void say(){
            //1.成员内部类可以直接访问外部类的所有成员变量和成员方法，包括私有的。
            System.out.println("n1=" + n1 + ", " + "name=" + name);
            //如果外部类和内部类的成员重名时，内部类访问的话，默认遵循就近原则，如果想访问外部类成员，可以使用（外部类.this.成员）去访问
            System.out.println("n1=" + Outer08.this.n1 + ", " + "name=" + name);
            hi();
        }

    }

    private class Inner09{
        public void eat(){}
    }

    public void waishow(){
        Inner09 inner09 = new Inner09();
        inner09.eat();
    }

    //外部类，使用成员内部类的方式：
    //外部类可以访问成员内部类的所有成员，包括私有的。
    //访问方式：创建对象，再访问】
    public void ti(){
        Inner08 inner08 = new Inner08();
        inner08.say();
        System.out.println(inner08.n1);

        Inner09 inner09 = new Inner09();
        inner09.eat();
    }


}
